#include"list.h"

int main()
{
    system("clear");

    //framebuffer初始化
        struct fb_var_screeninfo  vinfo;

        int fd = open("/dev/fb0", O_RDWR);
        if(fd < 0)
    {
        perror("open err. \n");
                exit(EXIT_FAILURE);
        }
        int fret = ioctl(fd, FBIOGET_VSCREENINFO, &vinfo);
        if(fret < 0)
    {
                perror("ioctl err. \n");
                exit(EXIT_FAILURE);
        }

//用来知道自己屏幕的分辨率
/*
        printf("vinfo.xres: %d\n", vinfo.xres);
        printf("vinfo.yres: %d\n", vinfo.yres);
        printf("vinfo.bits_per_pixel: %d\n", vinfo.bits_per_pixel);
*/

    //定义指针来操作framebuffer
    unsigned long* addr = mmap(NULL, (vinfo.xres*vinfo.yres*vinfo.bits_per_pixel)>>3,
            PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 


    //游戏初始化
    S *head = NULL;
    F *f = malloc(sizeof(F));
    draw_side(addr);
    cre_snake(&head);
    cre_food(f,head);
    draw_snake(addr,head);
    draw_food(addr,f);

    //初始化键盘设置
    int key, ret;
    char choose='d';//初始蛇的运动方向，d为右,a为左,w为上,s为下
    int speed = 1;//速度档1为0.4s走一步,0为0.2s走一步

    ret = init_keyboard();//接入键盘
    if(ret < 0)
        return -1;

    //游戏循环体，上下左右控制方向，空格变速，esc和q退出
    while(1)
    {
        key = get_key();
        //printf("key = %x\n", key);

        //接收键盘信息改变蛇的运动方向，调用if_move来防止直接掉头
        if(is_left(key))
        {
            if(if_move('a',choose))
                choose = 'a';
        }
        if(is_right(key))
        {
            if(if_move('d',choose))
                choose = 'd';
        }
        if(is_up(key))
        {
            if(if_move('w',choose))
                choose = 'w';
        }
        if(is_down(key))
        {
            if(if_move('s',choose))
                choose = 's';
        }

        //可以为回车添加其他功能   
//      if(is_enter(key))
//          printf("enter\n");

        //空格用来调速
        if(is_space(key))
        {
            if(speed)
                speed = 0;
            else
                speed = 1;
        }

        //退出游戏
        if(is_esc(key)){
            printf("esc\n");
            break;
        }
        if(key == 'q')
            break;

        //每次循环读取键盘信息后，先判断当前位置蛇是否吃到食物，再进行移动，然后判断是否gameover
        eat(head,f);
        move(choose,head);
        gameover(head);

        //刷新图像信息
        myclear(addr);
        draw_snake(addr,head);
        draw_food(addr,f);

        //可用于清除多余的按键操作，经过测试认为不清除比较好
       // int c;
       // while((c=getchar())!='\n'&&c!=EOF);

        //通过sleep来控制游戏循环的频率，从而控制蛇的速度
        if(speed)
            usleep(400000);
        else
            usleep(200000);

    }

        //恢复键盘
        recover_keyboard();
        return 0;
}
